package com.skyd.core.android.game;

import java.util.Comparator;
import java.util.Vector;

import com.skyd.core.android.game.GameObjectList.OnAddItemListener;
import com.skyd.core.android.game.GameObjectList.OnChangedListener;
import com.skyd.core.android.game.GameObjectList.OnRemoveItemListener;
import com.skyd.core.vector.Vector2DF;

import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Rect;

public class GameSpiritGroup extends GameSpirit {

	public GameSpiritGroup() {
		_SpiritList.addOnAddItemListener(new OnAddItemListener<GameSpirit>() {

			@Override
			public void OnAddItemEvent(Object sender, GameSpirit newItem) {
				newItem
						.addOnLevelChangedListener(Spirit_OnLevelChangedListener);
			}
		});
		_SpiritList
				.addOnRemoveItemListener(new OnRemoveItemListener<GameSpirit>() {

					@Override
					public void OnRemoveItemEvent(Object sender,
							GameSpirit oldItem) {
						oldItem
								.removeOnLevelChangedListener(Spirit_OnLevelChangedListener);
					}
				});
		_SpiritList.addOnChangedListener(new OnChangedListener() {

			@Override
			public void OnChangedEvent(Object sender, int newSize) {
				sortSpiritList();
			}
		});
	}

	GameSpirit.OnLevelChangedListener Spirit_OnLevelChangedListener = new GameSpirit.OnLevelChangedListener() {
		@Override
		public void OnLevelChangedEvent(Object sender, float value) {
			sortSpiritList();
		}
	};
	
	/**
	 * 根据名称获取组中的精灵，同名的精灵将一并返回，如果不存在则返回空列表
	 * 
	 * @param name
	 *            精灵名称
	 * @return 精灵
	 */
	public Vector<GameSpirit> getSpiritsByName(String name) {
		Vector<GameSpirit> l = new Vector<GameSpirit>();
		for (GameSpirit f : _SpiritList) {
			if (f.getName() == name)
				l.add(f);
		}
		return l;
	}

	/**
	 * 根据精灵的图层顺序进行排序
	 */
	protected void sortSpiritList() {
		_SpiritList.sort(new Comparator<GameSpirit>() {

			@Override
			public int compare(GameSpirit arg0, GameSpirit arg1) {
				if (arg0.getLevel() == arg1.getLevel())
					return 0;
				else if (arg0.getLevel() > arg1.getLevel())
					return 1;
				else
					return -1;
			}
		});
	}

	@Override
	public GameObject getDisplayContentChild() {
		return null;
	}

//	@Override
//	public void draw(Canvas c, Rect drawArea) {
//		if (!getDisplayVisible())
//			return;
//		if (_DrawingImage != null) {
//			_DrawingImage.recycle();
//			_DrawingImage = null;
//		}
//		_DrawingImage = Bitmap.createBitmap(c.getWidth(), c.getHeight(),
//				Config.ARGB_8888);
//		// c.save();
//		// operateCanvas(c);
//		Canvas bc = new Canvas(_DrawingImage);
//		bc.save();
//		operateCanvas(bc);
//		if (onDrawing(bc, drawArea)) {
//			drawChilds(bc, drawArea);
//			drawSelf(bc, drawArea);
//		}
//		onDrawn(bc, drawArea);
//		bc.restore();
//		drawToCanvas(c);
//		// c.restore();
//	}
//
//	private void drawToCanvas(Canvas c) {
//		Paint p = new Paint();
//		p.setAlpha((int) (getOpacity() * 255));
//		c.drawBitmap(_DrawingImage, 0, 0, p);
//	}

	@Override
	protected void drawChilds(Canvas c, Rect drawArea) {
		super.drawChilds(c, drawArea);
		for (GameSpirit f : _SpiritList) {
			f.draw(c, drawArea);
		}
	}

	@Override
	protected void updateChilds() {
		super.updateChilds();
		for (GameSpirit f : _SpiritList) {
			f.update();
		}
	}

//	/**
//	 * 初始值为null。 功能注释：子对象绘制出的图像
//	 */
//	private Bitmap _DrawingImage = null;
//
//	/**
//	 * 获取DrawingImage。 功能注释：子对象绘制出的图像
//	 * 
//	 * @return 当前的Bitmap类型的值
//	 */
//	public Bitmap getDrawingImage() {
//		return _DrawingImage;
//	}
//
//	/**
//	 * 设置DrawingImage。 功能注释：子对象绘制出的图像
//	 * 
//	 * @param value
//	 *            要设置的Bitmap类型值
//	 */
//	public void setDrawingImage(Bitmap value) {
//		_DrawingImage = value;
//	}
//
//	/**
//	 * 设置DrawingImage为其默认值(null)。 功能注释：子对象绘制出的图像
//	 */
//	public void setDrawingImageToDefault() {
//		setDrawingImage(null);
//	}

	/**
	 * 初始值为new GameObjectList<GameSpirit>()。 功能注释：内部的游戏精灵列表
	 */
	private GameObjectList<GameSpirit> _SpiritList = new GameObjectList<GameSpirit>(
			this);

	/**
	 * 获取SpiritList。 功能注释：内部的游戏精灵列表
	 * 
	 * @return 当前的GameObjectList<GameSpirit>类型的值
	 */
	public GameObjectList<GameSpirit> getSpiritList() {
		return _SpiritList;
	}

	/**
	 * 设置SpiritList。 功能注释：内部的游戏精灵列表
	 * 
	 * @param value
	 *            要设置的GameObjectList<GameSpirit>类型值
	 */
	public void setSpiritList(GameObjectList<GameSpirit> value) {
		_SpiritList = value;
	}

	/**
	 * 设置SpiritList为其默认值(new GameObjectList<GameSpirit>())。 功能注释：内部的游戏精灵列表
	 */
	public void setSpiritListToDefault() {
		setSpiritList(new GameObjectList<GameSpirit>(this));
	}

	@Override
	public float getDrawHeight() {
		return 0;
	}

	@Override
	public Vector2DF getDrawSize() {
		return new Vector2DF();
	}

	@Override
	public float getDrawWidth() {
		return 0;
	}
	
	/**
	 * 将对象分离出组
	 */
	public void separate(GameSpirit s){

//		s.setParent(null);

		Matrix m = s.getMatrix();
		s.getPosition().resetWith(s.getDisplayPosition(m).minus(s.getPositionOffset()));
		s.setRotation(s.getDisplayRotation(m));
		s.getScale().resetWith(s.getDisplayScale(m));
		s.setOpacity(s.getOpacity()*this.getOpacity());
		_SpiritList.remove(s);
	}
}
